home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / gtlayout-source.lha / LT_LayoutMenus.c < prev    next >
C/C++ Source or Header  |  1995-09-24  |  3KB  |  167 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1995 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. struct Menu * __stdargs
  10. LT_LayoutMenus(LayoutHandle *handle,struct NewMenu *menuTemplate,...)
  11. {
  12.     struct Menu    *Result;
  13.     va_list      VarArgs;
  14.  
  15.     va_start(VarArgs,menuTemplate);
  16.     Result = LT_LayoutMenusA(handle,menuTemplate,(struct TagItem *)VarArgs);
  17.     va_end(VarArgs);
  18.  
  19.     return(Result);
  20. }
  21.  
  22.  
  23. /*****************************************************************************/
  24.  
  25.  
  26. struct Menu * LIBENT
  27. LT_LayoutMenusA(REG(a0) LayoutHandle *handle,REG(a1) struct NewMenu *menuTemplate,REG(a2) struct TagItem *TagParams)
  28. {
  29.     struct Menu *menu;
  30.  
  31.     menu = NULL;
  32.  
  33.     if(handle)
  34.     {
  35.         struct TagItem    *tag,*List = TagParams;
  36.         LONG         label,last;
  37.         LONG        *Table = NULL;
  38.         ULONG         allocSize;
  39.         BOOLEAN      foundFirst;
  40.         BOOLEAN      foundLast;
  41.  
  42.         foundFirst    = FALSE;
  43.         foundLast    = FALSE;
  44.  
  45.         while(tag = NextTagItem(&List))
  46.         {
  47.             switch(tag -> ti_Tag)
  48.             {
  49.                 case LA_LabelTable:
  50.  
  51.                     Table = (LONG *)tag -> ti_Data;
  52.                     break;
  53.  
  54.                 case LA_FirstLabel:
  55.  
  56.                     foundFirst = TRUE;
  57.  
  58.                     label = tag -> ti_Data;
  59.                     break;
  60.  
  61.                 case LA_LastLabel:
  62.  
  63.                     foundLast = TRUE;
  64.  
  65.                     last = tag -> ti_Data;
  66.                     break;
  67.             }
  68.         }
  69.  
  70.         if(foundFirst == foundLast || Table)
  71.         {
  72.             struct NewMenu *localTemplate = NULL;
  73.  
  74.             if(Table)
  75.             {
  76.                 foundFirst = FALSE;
  77.  
  78.                 if(handle -> LocaleHook)
  79.                 {
  80.                     LONG count;
  81.  
  82.                     count = 0;
  83.  
  84.                     while(menuTemplate[count] . nm_Type != NM_END)
  85.                         count++;
  86.  
  87.                     count++;
  88.  
  89.                     if(localTemplate = LTP_Alloc(handle,allocSize = sizeof(struct NewMenu) * count))
  90.                     {
  91.                         LONG i;
  92.  
  93.                         CopyMem(menuTemplate,localTemplate,sizeof(struct NewMenu) * count);
  94.  
  95.                         for(i = 0 ; *Table != -1 && i < count ; i++)
  96.                         {
  97.                             if(localTemplate[i] . nm_Label != NM_BARLABEL && (localTemplate[i] . nm_Type == NM_TITLE || localTemplate[i] . nm_Type == NM_ITEM || localTemplate[i] . nm_Type == NM_SUB))
  98.                                 localTemplate[i] . nm_Label = (STRPTR)CallHookPkt(handle -> LocaleHook,handle,(APTR)(*Table++));
  99.                         }
  100.                     }
  101.                 }
  102.  
  103.                 menuTemplate = localTemplate;
  104.             }
  105.  
  106.             if(foundFirst)
  107.             {
  108.                 if(handle -> LocaleHook)
  109.                 {
  110.                     LONG count;
  111.  
  112.                     count = 0;
  113.  
  114.                     while(menuTemplate[count] . nm_Type != NM_END)
  115.                         count++;
  116.  
  117.                     count++;
  118.  
  119.                     if(localTemplate = LTP_Alloc(handle,allocSize = sizeof(struct NewMenu) * count))
  120.                     {
  121.                         LONG i;
  122.  
  123.                         CopyMem(menuTemplate,localTemplate,sizeof(struct NewMenu) * count);
  124.  
  125.                         if(foundLast)
  126.                             count = last - label + 1;
  127.  
  128.                         for(i = 0 ; i < count ; i++)
  129.                         {
  130.                             if(localTemplate[i] . nm_Label != NM_BARLABEL && (localTemplate[i] . nm_Type == NM_TITLE || localTemplate[i] . nm_Type == NM_ITEM || localTemplate[i] . nm_Type == NM_SUB))
  131.                             {
  132.                                 localTemplate[i] . nm_Label = (STRPTR)CallHookPkt(handle -> LocaleHook,handle,(APTR)label);
  133.  
  134.                                 label++;
  135.                             }
  136.                         }
  137.                     }
  138.                 }
  139.  
  140.                 menuTemplate = localTemplate;
  141.             }
  142.  
  143.             if(menuTemplate)
  144.             {
  145.                 if(menu = CreateMenusA(menuTemplate,NULL))
  146.                 {
  147.                     if(!LayoutMenus(menu,handle -> VisualInfo,
  148.                         GTMN_NewLookMenus,    TRUE,
  149.  
  150.                         handle -> AmigaGlyph ? GTMN_AmigaKey :    TAG_IGNORE,handle -> AmigaGlyph,
  151.                         handle -> CheckGlyph ? GTMN_Checkmark : TAG_IGNORE,handle -> CheckGlyph,
  152.                     TAG_DONE))
  153.                     {
  154.                         FreeMenus(menu);
  155.  
  156.                         menu = NULL;
  157.                     }
  158.                 }
  159.             }
  160.  
  161.             LTP_Free(handle,localTemplate,allocSize);
  162.         }
  163.     }
  164.  
  165.     return(menu);
  166. }
  167.